import os
import json
import requests
from config import WE_CHAT_ALERT_API_KEY


class WeChatAlertException(Exception):
    pass


class WeChatAlert:
    def __init__(self) -> None:
        self.api_key = WE_CHAT_ALERT_API_KEY
        self.headers = {"Content-Type": "application/json"}

    def _build_data(
        self, message_content: str, wx_name: str = None, room_name: str = None
    ) -> dict:
        """
        构建消息数据字典。

        :param message_content: 消息内容。
        :param name: 好友昵称（不能又特殊字符）。
        :param room_name: 群名。
        :return: 包含消息数据的字典。
        """
        data = {
            "apiKey": self.api_key,
            "message": {"type": 1, "content": message_content},
        }
        if wx_name:
            data["name"] = wx_name
        elif room_name:
            data["roomName"] = room_name
        else:
            raise WeChatAlertException("wx_name和room_name不能同时为空")
        return data

    def _send_request(self, url: str, data: dict) -> dict:
        """
        发送HTTP POST请求。

        :param url: 请求的URL。
        :param data: 发送的数据。
        :return: 请求返回的JSON数据。
        :raises requests.exceptions.RequestException: 如果请求失败。
        """
        response = requests.post(
            url=url, data=json.dumps(data), headers=self.headers)
        response.raise_for_status()  # 确保状态良好，否则抛出异常
        return response.json()

    def send_message(
        self, wx_name: str = None, room_name: str = None, message: str = None
    ) -> dict:
        """
        发送消息到指定的好友或群。

        :param name: 接收消息的好友。
        :param room_name: 接收消息的群。
        :param message: 要发送的消息内容。
        :return: 请求的响应JSON数据。
        :raises WeChatAlertException: 如果wx_name和room_name都为空。
        """
        data = self._build_data(message, wx_name, room_name)
        if wx_name and room_name:
            raise WeChatAlertException("wx_name和room_name不能同时存在")
        if wx_name:
            url = "https://api-bot.aibotk.com/openapi/v1/chat/contact"
        elif room_name:
            url = "https://api-bot.aibotk.com/openapi/v1/chat/room"
        else:
            raise WeChatAlertException("wx_name和room_name不能同时为空")

        return self._send_request(url, data)
